home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tango2.lha / SOURCES / 1pix.s next >
Text File  |  1988-07-19  |  10KB  |  476 lines

  1. ; ** THE SLOOOW ONE PIXEL ACCURACY SINE WAVE BY TANGO **
  2. ; ** RAY SEE IF YOU CAN GET THIS ONE TO GO FASTER !!! **
  3. ;     ** ONLY GIVE THE SOURCE TO CRYPTIC MEMBERS. **
  4.  
  5.     opt c-
  6.     section blitter,code_c            Chip Ram please !!
  7.     include    df1:definitions            Give me some hardware reggies
  8.     include    df1:macros                Give me some macros
  9.     
  10.         
  11. ;LOCAL CONSTANTS
  12.  
  13. icra        equ $bfed01                
  14. allocmem     =-30-168                
  15. freemem     =-30-180                
  16.  
  17.  
  18. TAKEOVER:
  19.         
  20.     LEA custom,a5        
  21.     LEA GFXLIB(PC),a1             Point to 'graphics.library'
  22.     MOVEQ #0,D0                     Doesn't matter which version
  23.      MOVE.L 4.w,a6                 EXECBASE
  24.     jsr    -132(a6)                 task switching off (forbid)
  25.      JSR -$228(a6)                  Openlibrary
  26.      MOVE.L D0,GFXBASE             Store library address
  27.  
  28.         
  29.      move.l GFXBASE,d0            Move gfxbase offset to d0
  30.      MOVE.L D0,A6                
  31.      MOVE.W #$80,dmacon(a5)        Turn off copper whilst changing it
  32.      MOVE.L $32(A6),WBCOPPER         Store old (WBench) copper address
  33.      MOVE.L #OURCOPPER,$32(A6)    Point to new copper list (our own)
  34.      MOVE.W #$8080,dmacon(a5)    re-enable copper
  35.  
  36.      MOVE.W #$8010,intena(a5)        
  37.      MOVE.L $6c,old                Save work bench interrupt
  38.      MOVE.L #LEV3,$6c            This sets up a level 3 interrupt
  39.     move.w    intenar(a5),systemints
  40.     move.b    #%01111111,icra        Kill keyboard
  41.         
  42. WAIT:     
  43.     BTST #6,$BFE001                This waits for the left
  44.      BNE.S    WAIT                mouse button to be pressed
  45.     move.l    4.w,a6                EXECBASE
  46.      MOVE.L old,$6c                Restore system interrupts
  47.     MOVE.L GFXBASE,A6
  48.      MOVE.W #$80,dmacon(a5)        Disable DMA
  49.      MOVE.L WBCOPPER,$32(A6)        Restore old copperlist
  50.      MOVE.W #$8080,dmacon(a5)    Enable DMA
  51.      move.w    systemints,d0        Systems interrupt
  52.      or.w    #$c000,d0
  53.      move.w    d0,intena(a5)        Enable OS interrupts
  54.      move.b    #%10011011,icra        Enable keyboard
  55.     clr.w    $dff0a8                Clear music
  56.     clr.w    $dff0b8
  57.     clr.w    $dff0c8
  58.     clr.w    $dff0d8
  59.     move.w    #$f,$dff096
  60.     rts
  61.  
  62.  
  63. ERROR:    
  64.     move.l 4.w,a6                Get EXECBASE
  65.     jsr    -138(a6)                Permit ( multi-tasking on )
  66.     moveq    #0,d0                Clear d0
  67.      RTS                            Return to AmigaDOS
  68.  
  69.  
  70. ;This is the NEW level 3 interrupt
  71.  
  72. LEV3:
  73.      MOVEM.L d0-d7/a0-a6,-(sp)    Save all registers to the stack
  74.     lea    custom,a5
  75.     AND #$10,intreqr(a5)           Check if interrupt is from Copper 
  76.     BNE out
  77.     move.w    #$8010,$9c                                
  78.     
  79.     bsr    try_sin
  80.     bsr    scroll
  81.  
  82.      move.l    sin_screen,d1        Bitplane memory address
  83.     move.w    d1,bp1lo+2
  84.      swap    d1
  85.      move.w    d1,bp1hi+2
  86.  
  87.     
  88. out:     
  89.     MOVEM.L (sp)+,d0-d7/a0-a6    Restore the registers
  90.     DC.W $4ef9                    hex value for  JMP instruction
  91. old:     
  92.     DC.L 0                        will jump to normal interrupt
  93.  
  94.  
  95. ; ** Double Buffer The Screen **
  96.  
  97. Buff:
  98.     Eor.l    #10240,Tango
  99.     Move.l    Tango,D1
  100.     Move.l    #SinePlane,d2
  101.     Add.l    D1,d2
  102.     Move.l    D2,Sin_Screen
  103.     Rts
  104.  
  105.  
  106. ; ** THE SCROLL ROUTINE **
  107.  
  108. scroll
  109.     cmp.l    #15,val                    Blitshifted all <<<
  110.     blo.s    coarse_scroll_it        No then get doing it !!
  111.     bsr        blit_char                Blit letter to screen
  112.     clr.l    val                        Reset index
  113. coarse_scroll_it:
  114.     bsr        coarse                    Scroll all line
  115.     rts                            
  116.     
  117.     
  118. ; ** BLIT LETTER ON THE SCREEN **
  119.  
  120. blit_char
  121.     jsr        text
  122.     lea        custom,a5                Get custom chip address
  123.     move.l    screenx,a0                 Can~t see this picture !!
  124.     move.l    #font,a1                 Put font in blitter source
  125.     add.l    d1,a1
  126. blit_test:
  127.     btst    #14,$dff002                 Blitter busy !!!
  128.     bne    blit_test                     Lets wait till she finishes !
  129.     move.w    #$ffff,bltafwm(a5)        Mask (DON'T NEED ONE)
  130.     move.w    #$ffff,bltalwm(a5)        Mask (DON'T NEED ONE)
  131.     move.l    a0,bltdpth(a5)             Blitter dest D (BOTTOM OF SCREEN)
  132.     move.l    a1,bltapth(a5)             Blitter source A (SCROLLING FONT)
  133.     move.w    #38,bltamod(a5)             Modulo (20-1)*2
  134.     move.w    #38,bltdmod(a5)             Modulo (20-1)*2
  135.     move.w    #$9f0,bltcon0(a5)         Minterms D=A
  136.     clr.w    bltcon1(a5)                 Set Ascending mode
  137.      move.w    #16*64+1,bltsize(a5)     Blit size (SIZE OF FONT)
  138.     rts                                  Return
  139.  
  140.  
  141. ; ** BLITSHIFT THE ENTIRE SCROLL LINE (BETTER THAN USING THE HARDWARE).
  142.  
  143. coarse:
  144.     lea        custom,a5                 
  145.     move.l    screenx,a0                ; Can~t see this picture !!
  146.     move.l    a0,a1
  147.     add.l    #2,a1
  148. blit_wait:
  149.     btst    #14,$dff002            
  150.     bne        blit_wait
  151.     incl    #1,val                    ; (1 for slower)
  152.     move    #15,d7                    ; Amount of pixels to shift(15 for slow)
  153.     ror        #4,d7                    ; Set to correct bits (12-15)
  154.     or        #%100111110000,d7        
  155.     move.l    #-1,bltafwm(a5)
  156.     move.l    a1,bltapth(a5)
  157.     move.l    a0,bltdpth(a5)
  158.     move.w    #0,bltamod(a5)
  159.     move.w    #0,bltdmod(a5)
  160.     move.w    d7,bltcon0(a5)    
  161.     move.w    #80*64+20,bltsize(a5)
  162.     rts    
  163.  
  164.  
  165. ; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **
  166.  
  167. CLEAR:
  168.     Move.l    Sin_Screen,a0
  169. wate
  170.     btst    #14,$dff002
  171.     bne.s    wate
  172.     Move.l    a0,Bltdpth(a5)
  173.     Move    #0,Bltdmod(a5)
  174.     Move.l    #$1f00000,Bltcon0(a5)
  175.     Move    #150*64+20,Bltsize(a5)
  176.     Rts
  177.  
  178.  
  179. try_sin:
  180.     Bsr        buff
  181.     bsr        clear
  182.     Move.l    Table1,A3
  183.     Move.b    (A3),d1
  184.     Cmp.b    #$ff,d1
  185.     Bne        ItsOkYa
  186.     Move.l    #SinTab,A3
  187. ItsOkYa
  188.     Add.l    hi_amplitude,A3
  189.     Move.l    a3,Table1
  190.     Move.l    A3,Table
  191.     lea        custom,a5                 
  192.     move.l    screenx,a0                 ; Source A
  193.     move.l    #20,d4                    ; Number of chars along screen
  194.     clr.l    d5
  195.     clr.l    d6
  196. ban:
  197.     move.w    #%1000000000000000,d3
  198.     move.l    #15,d2
  199. blit_test0:
  200.     btst    #14,$dff002                 
  201.     bne    blit_test0                     
  202.     move.l    sin_screen,a1
  203.     bsr        get_sinvalue
  204.     move.w    d3,bltafwm(a5)        
  205.     move.w    d3,bltalwm(a5)        
  206.     move.l    a1,bltdpth(a5)             
  207.     move.l    a1,bltbpth(a5)             
  208.     move.l    a0,bltapth(a5)             
  209.     move.w    #38,bltamod(a5)             
  210.     move.w    #38,bltdmod(a5)             
  211.     move.w    #38,bltbmod(a5)             
  212.     move.w    #$dfc,bltcon0(a5)         
  213.     clr.w    bltcon1(a5)                 
  214.      move.w    #16*64+1,bltsize(a5)     
  215.     lsr.w    #1,d3
  216.     dbf        d2,blit_test0
  217.     add.l    #2,a0                    ; Get next letter along
  218.     add.l    #2,d6
  219.     dbf        d4,ban
  220.     rts                                  
  221.  
  222. get_sinvalue:
  223.     Clr.l    D5
  224.     Move.l    Table,A3
  225.     Move.b    (A3),d5
  226.     cmp.b    #$ff,d5
  227.     bne        cryptic90
  228.     Move.l    #SinTab,A3
  229.     Move.b    (a3),d5
  230. cryptic90
  231.     Add.l    lo_amplitude,A3
  232.     Move.l    A3,Table
  233.     mulu    #40,d5
  234.     add.l    d5,a1
  235.     Add.l    D6,A1
  236.     rts
  237. Table1:    Dc.l    SinTab    
  238. table:    dc.l    sintab
  239. sintab:
  240.     dc.b $3C,$3F,$42,$46,$49,$4C,$50,$53,$56,$59
  241.     dc.b $5C,$5F,$61,$64,$67,$69,$6B,$6D,$6F,$71
  242.     dc.b $72,$73,$75,$76,$76,$77,$77,$77,$77,$77
  243.     dc.b $77,$76,$76,$75,$73,$72,$71,$6F,$6D,$6B
  244.     dc.b $69,$67,$64,$61,$5F,$5C,$59,$56,$53,$50
  245.     dc.b $4C,$49,$46,$42,$3F,$3C,$38,$35,$31,$2E
  246.     dc.b $2B,$27,$24,$21,$1E,$1B,$18,$16,$13,$10
  247.     dc.b $E,$C,$A,$8,$6,$5,$4,$2,$1,$1
  248.     dc.b $0,$0,$0,$0,$0,$0,$1,$1,$2,$4
  249.     dc.b $5,$6,$8,$A,$C,$E,$10,$13,$16,$18
  250.     dc.b $1B,$1E,$21,$24,$27,$2B,$2E,$31,$35
  251.     dc.b $38,255
  252.      EVEN
  253.      
  254.  
  255. ; ** CHARACTER DECODER ROUTINE **
  256.  
  257. text:
  258.     move.l    acurent,a2                Get message
  259.     clr.l    d1                        
  260.     move.b    (a2)+,d1                Update it
  261.     move.b    d1,letter                Store in offset
  262.     cmp.b    #255,d1                    Check for end of message
  263.     beq.w    rst_text                If equal, then reset
  264.     sub.l    #32,d1                    Subract 32 (ie space)
  265.     asl        d1                        Times by 2 
  266.     move.l    a2,acurent                Update acurent
  267.     CMP.B    #"4",letter                Is letter "K" or larger
  268.     BPL.s    add_more                If larger then add on
  269.     rts                                Return
  270. add_more:
  271.     CMP.B    #"H",letter                Is letter "U" or larger
  272.     BPL.S    add_more2                If larger then add on
  273.     add.l    #40*15,d1                Get next line down (KLMNOPQRST)
  274.     rts
  275. add_more2:                    
  276.     add.l    #40*30,d1                Get next line down (UVWXYZ0123)
  277.     rts
  278. rst_text:
  279.     move.l    #0,d1
  280.     move.l    #message,d2                Get begining of text
  281.     move.l    d2,acurent                Reset to begining
  282.     rts                                Return
  283.  
  284.  
  285. message:
  286.  
  287.  
  288.     DC.B    "  HI RAY    THIS IS THE 1 PIXEL SINE SCROLL AND AS YOU CAN SEE ITS SLOW"
  289.     DC.B    "   SEE IF KODAK CAN SPEED IT UP !!!!!       SEE YOU         WRAP        "
  290.     DC.B    255
  291.     EVEN
  292.  
  293.  
  294. ; ** THE COPPERLIST **
  295.  
  296. OURCOPPER:
  297.         dc.w    $120,0
  298.         dc.w    $122,0
  299.         dc.w    bpl1mod,0,bpl2mod,0
  300.         dc.w    diwstrt,$2c81+16,diwstop,$2cc1
  301.         dc.w    bplcon0,$1200,bplcon1,$0000
  302.         dc.w    ddfstrt,$38,ddfstop,$d0
  303.         dc.w    color00,$000,color01,$094
  304. bp1lo:    dc.w    bpl1ptl,$0000
  305. bp1hi:    dc.w    bpl1pth,$0000
  306.         wait    $2c09,$fffe
  307.         dc.w    color01,$f00
  308.         wait    $2e09,$fffe
  309.         dc.w    color01,$f11
  310.         wait    $3009,$fffe
  311.         dc.w    color01,$f00
  312.         wait    $3209,$fffe
  313.         dc.w    color01,$f11
  314.         wait    $3409,$fffe
  315.         dc.w    color01,$f22
  316.         wait    $3609,$fffe
  317.         dc.w    color01,$f33
  318.         wait    $389,$fffe
  319.         dc.w    color01,$f44
  320.         wait    $3a09,$fffe
  321.         dc.w    color01,$f55
  322.         wait    $3c09,$fffe
  323.         dc.w    color01,$f66
  324.         wait    $3e09,$fffe
  325.         dc.w    color01,$f77
  326.         wait    $4009,$fffe
  327.         dc.w    color01,$f88
  328.         wait    $4209,$fffe
  329.         dc.w    color01,$f99
  330.         wait    $4409,$fffe
  331.         dc.w    color01,$faa
  332.         wait    $4609,$fffe
  333.         dc.w    color01,$fbb
  334.         wait    $4809,$fffe
  335.         dc.w    color01,$fcc
  336.         wait    $4a09,$fffe
  337.         dc.w    color01,$fdd
  338.         wait    $4c09,$fffe
  339.         dc.w    color01,$fee
  340.         wait    $4e09,$fffe
  341.         dc.w    color01,$fff
  342.         wait    $5109,$fffe
  343.         dc.w    color01,$eef
  344.         wait    $5309,$fffe
  345.         dc.w    color01,$ddf
  346.         wait    $5509,$fffe
  347.         dc.w    color01,$ccf
  348.         wait    $5709,$fffe
  349.         dc.w    color01,$bbf
  350.         wait    $5909,$fffe
  351.         dc.w    color01,$aaf
  352.         wait    $5b09,$fffe
  353.         dc.w    color01,$99f
  354.         wait    $5d09,$fffe
  355.         dc.w    color01,$88f
  356.         wait    $5f09,$fffe
  357.         dc.w    color01,$77f
  358.         wait    $6109,$fffe
  359.         dc.w    color01,$66f
  360.         wait    $6309,$fffe
  361.         dc.w    color01,$55f
  362.         wait    $6509,$fffe
  363.         dc.w    color01,$44f
  364.         wait    $6709,$fffe
  365.         dc.w    color01,$33f
  366.         wait    $6909,$fffe
  367.         dc.w    color01,$22f
  368.         wait    $6a09,$fffe
  369.         dc.w    color01,$11f
  370.         wait    $6c09,$fffe
  371.         dc.w    color01,$00f
  372.         wait    $6e09,$fffe
  373.         dc.w    color01,$11f
  374.         wait    $7109,$fffe
  375.         dc.w    color01,$22f
  376.         wait    $7309,$fffe
  377.         dc.w    color01,$33f
  378.         wait    $7509,$fffe
  379.         dc.w    color01,$44f
  380.         wait    $7709,$fffe
  381.         dc.w    color01,$55f
  382.         wait    $7909,$fffe
  383.         dc.w    color01,$66f
  384.         wait    $7a09,$fffe
  385.         dc.w    color01,$77f
  386.         wait    $7c09,$fffe
  387.         dc.w    color01,$88f
  388.         wait    $7e09,$fffe
  389.         dc.w    color01,$99f
  390.         wait    $8009,$fffe
  391.         dc.w    color01,$aaf
  392.         wait    $8209,$fffe
  393.         dc.w    color01,$bbf
  394.         wait    $8409,$fffe
  395.         dc.w    color01,$ccf
  396.         wait    $8609,$fffe
  397.         dc.w    color01,$ddf
  398.         wait    $8809,$fffe
  399.         dc.w    color01,$eef
  400.         wait    $8a09,$fffe
  401.         dc.w    color01,$fff
  402.         wait    $8c09,$fffe
  403.         dc.w    color01,$fee
  404.         wait    $8e09,$fffe
  405.         dc.w    color01,$fdd
  406.         wait    $9109,$fffe
  407.         dc.w    color01,$fcc
  408.         wait    $9309,$fffe
  409.         dc.w    color01,$fbb
  410.         wait    $9509,$fffe
  411.         dc.w    color01,$faa
  412.         wait    $9709,$fffe
  413.         wait    $9909,$fffe
  414.         dc.w    color01,$f99
  415.         wait    $9b09,$fffe
  416.         dc.w    color01,$f88
  417.         wait    $9d09,$fffe
  418.         dc.w    color01,$f77
  419.         wait    $9f09,$fffe
  420.         dc.w    color01,$f66
  421.         wait    $a109,$fffe
  422.         end_copper
  423.         
  424.  
  425. ;LOCAL CONSTANTS
  426.  
  427. WBCOPPER:        DC.L    0
  428. GFXLIB:            DC.B     "graphics.library",0
  429. GFXBASE:        DC.L    0
  430. systemints:        dc.l    0
  431. scroll_offset:    dc.l    0
  432. screenx:        dc.l    picture
  433. letter:            dc.b    0
  434. acurent:        dc.l    message
  435. val:            dc.l    0
  436. lo_amplitude:    dc.l    1
  437. hi_amplitude:    dc.l    2
  438. Tango            Dc.l    0
  439. sin_screen:        Dc.l    SinePlane
  440.  
  441.  
  442. ;BINARY FILES TO BE INCLUDED
  443.     EVEN
  444. picture    
  445.     dcb.b    10240,0
  446. SinePlane
  447.     dcb.b    10240,0
  448.     dcb.b    10240,0
  449. font
  450.     incbin    df1:neatfont.bin
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.     
  458.     
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.     
  467.     
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.